package pers.jl.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pers.jl.common.R;
import pers.jl.dto.DishDto;
import pers.jl.service.IDishService;

import java.util.List;

/**
 * <p>
 * 菜品管理 前端控制器
 * </p>
 *
 * @author luge
 * @since 2023-04-22
 */
@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {

    @Autowired
    private IDishService dishService;


    /**
     * 菜品保存
     * 注意是多表保存，需要自定义保存方法
     * @param dishDto
     * @return
     */
    @PostMapping
    public R saveDish(@RequestBody DishDto dishDto){
        // 为什么可以接收到父类的私有属性值，明明私有属性无法继承？
        // 如果子类中公有的方法影响到了父类私有属性，那么父类私有属性是能够被子类使用的。
        // 如果说，父类为私有属性写了public的get和set方法，那么子类可以继承这两个get和set方法，
        // 从而达到操作父类的私有属性的目的。实际上，子类已经继承了父类的私有属性

        // 由于涉及多表保存，基本的保存方法无法满足需求，这里我们自定义一个保存菜品和菜品口味的方法
        dishService.saveWithFlavor(dishDto);
        return R.success("保存成功！");
    }

    /**
     * 菜品管理页面分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page<DishDto>> dishPage(int page,int pageSize,String name){
        // 自定义方法分页查询，返回全是DishDto实体类的分页对象
        Page<DishDto> dishDtoPage = dishService.pageForDish(page, pageSize, name);
        return R.success(dishDtoPage);
    }

    /**
     * 修改菜品时，根据菜品id进行数据回显
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> dataBack(@PathVariable Long id){

        // 由于涉及多表联查，我们自定义一个方法来查询
        DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
    }

    /**
     * 修改菜品
     * @param dishDto
     * @return
     */
    @PutMapping
    public R updateDish(@RequestBody DishDto dishDto){

        // 更新菜品涉及多表更新，我们自定义一个方法
        dishService.updataWithFlavor(dishDto);
        return R.success("更新成功！");
    }


    /**
     * 删除单个菜品或批量删除菜品
     * @param ids
     * @return
     */
    @DeleteMapping
    public R deleteManyDish(String ids){// 这个ids是字符串，有可能有多个id，以逗号分隔

        // 同时删除菜品和菜品口味
        dishService.deleteWithFlavor(ids);
        return R.success("删除菜品成功！");
    }

    /**
     * 更改单个菜品状态或批量更改菜品状态
     * @param status
     * @param ids
     * @return
     */
    @PostMapping("/status/{status}")
    public R updateDishStatus(@PathVariable int status,String ids){

        // 修改菜品状态
        dishService.updateStatus(status,ids);
        return R.success("状态修改成功！");
    }


    /**
     * 根据分类id查出所有该菜品分类下的菜品，且状态为启售状态
     * 套餐页面新增套餐时调用
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    public R<List<DishDto>> listForSetmeal(Long categoryId){

        // 根据分类id查出所有该菜品分类下的菜品，且状态为启售状态
        List<DishDto> dishList = dishService.getDishByCategoryId(categoryId);
        return R.success(dishList);
    }

}
